home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / lib / udev / udev-add-printer < prev    next >
Text File  |  2009-10-19  |  8KB  |  205 lines

  1. #!/usr/bin/python
  2.  
  3. ## udev-add-printer
  4.  
  5. ## Copyright (C) 2009 Red Hat, Inc.
  6. ## Author: Tim Waugh <twaugh@redhat.com>
  7.  
  8. ## This program is free software; you can redistribute it and/or modify
  9. ## it under the terms of the GNU General Public License as published by
  10. ## the Free Software Foundation; either version 2 of the License, or
  11. ## (at your option) any later version.
  12.  
  13. ## This program is distributed in the hope that it will be useful,
  14. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ## GNU General Public License for more details.
  17.  
  18. ## You should have received a copy of the GNU General Public License
  19. ## along with this program; if not, write to the Free Software
  20. ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. import cups
  23. import cupshelpers
  24. import dbus
  25. import os
  26. import sys
  27. import subprocess
  28. import traceback
  29. from syslog import *
  30.  
  31. def create_queue (c, printers, name, device_uri, ppdname, info):
  32.     # Make sure the name is unique.
  33.     namel = unicode (name.lower ())
  34.     unique = False
  35.     suffix = 1
  36.     while not unique:
  37.         unique = True
  38.         for printer in printers.values ():
  39.             if (not printer.discovered and
  40.                 ((suffix == 1 and printer.name.lower () == namel) or
  41.                  (suffix > 1 and
  42.                   printer.name.lower () == namel + "-" + str (suffix)))):
  43.                 unique = False
  44.                 break
  45.  
  46.         if not unique:
  47.             suffix += 1
  48.             if suffix == 100:
  49.                 break
  50.  
  51.     if suffix > 1:
  52.         name += "-" + str (suffix)
  53.  
  54.     c.addPrinter (name,
  55.                   device=device_uri,
  56.                   ppdname=ppdname,
  57.                   info=info,
  58.                   location=os.uname ()[1])
  59.     cupshelpers.activateNewPrinter (c, name)
  60.     return name
  61.  
  62. def add_queue (device_id, device_uris, fax_basename=False):
  63.     """
  64.     Create a CUPS queue.
  65.  
  66.     device_id: the IEEE 1284 Device ID of the device to add a queue for.
  67.     device_uris: device URIs, best first, for this device
  68.     fax_basename: False if this is not a fax queue, else name prefix
  69.     """
  70.  
  71.     syslog (LOG_DEBUG, "add_queue: URIs=%s" % device_uris)
  72.     if fax_basename != False:
  73.         notification = None
  74.     else:
  75.         try:
  76.             bus = dbus.SystemBus ()
  77.             obj = bus.get_object ("com.redhat.NewPrinterNotification",
  78.                                   "/com/redhat/NewPrinterNotification")
  79.             notification = dbus.Interface (obj,
  80.                                            "com.redhat.NewPrinterNotification")
  81.             notification.GetReady ()
  82.         except dbus.DBusException, e:
  83.             syslog (LOG_DEBUG, "D-Bus method call failed: %s" % e)
  84.             notification = None
  85.  
  86.     id_dict = cupshelpers.parseDeviceID (device_id)
  87.     c = cups.Connection ()
  88.     ppds = cupshelpers.ppds.PPDs (c.getPPDs ())
  89.     (status, ppdname) = ppds.getPPDNameFromDeviceID (id_dict["MFG"],
  90.                                                      id_dict["MDL"],
  91.                                                      id_dict["DES"],
  92.                                                      id_dict["CMD"],
  93.                                                      device_uris[0])
  94.     syslog (LOG_DEBUG, "PPD: %s; Status: %d" % (ppdname, status))
  95.  
  96.     if status == 0 and \
  97.             (id_dict["MFG"].lower () == "hp" or
  98.              id_dict["MFG"].lower () == "hewlett-packard"):
  99.         syslog(LOG_DEBUG,
  100.                "%s: Checking whether plugin is needed" % id_dict["MDL"])
  101.         os.environ["hp_model"] = id_dict["MDL"];
  102.         cmd = 'LC_ALL=C hp-mkuri -c'
  103.         try:
  104.             p = subprocess.Popen (cmd, shell=True,
  105.                                   stdin=file("/dev/null"),
  106.                                   stdout=subprocess.PIPE,
  107.                                   stderr=subprocess.PIPE)
  108.             (stdout, stderr) = p.communicate ()
  109.             if p.returncode == 2:
  110.                 # plugin not installed but required
  111.                 syslog(LOG_DEBUG,
  112.                        "%s: Plugin required and needs to be installed" \
  113.                            % id_dict["MDL"])
  114.                 status = 1
  115.         except:
  116.             # Problem executing command.
  117.             syslog(LOG_DEBUG,
  118.                    "%s: Check whether plugin is needed failed." % \
  119.                        id_dict["MDL"])
  120.             pass
  121.  
  122.     if status == 0:
  123.         # Think of a name for it.
  124.         name = id_dict["MDL"]
  125.         name = name.replace (" ", "-")
  126.         name = name.replace ("/", "-")
  127.         name = name.replace ("#", "-")
  128.  
  129.         if fax_basename != False:
  130.             name = fax_basename + "-" + name
  131.  
  132.         printers = cupshelpers.getPrinters (c)
  133.         uniquename = create_queue (c, printers, name, device_uris[0], ppdname,
  134.                                    "%s %s" % (id_dict["MFG"], id_dict["MDL"]))
  135.  
  136.         if fax_basename == False:
  137.             # Look for a corresponding fax queue.  We can only
  138.             # identify these by looking for device URIs that are the
  139.             # same as this one but with a different scheme.  If we
  140.             # find one whose scheme ends in "fax", use that as a fax
  141.             # queue.  Note that the HPLIP backends do follow this
  142.             # pattern (hp and hpfax).
  143.             used_uris = map (lambda x: x.device_uri, printers.values ())
  144.             for uri in device_uris[1:]:
  145.                 if uri.find (":") == -1:
  146.                     continue
  147.  
  148.                 (scheme, rest) = uri.split (":", 1)
  149.                 if scheme.endswith ("fax"):
  150.                     # Now see if the non-scheme parts of the URI match
  151.                     # any of the URIs we were given.
  152.                     for each_uri in device_uris:
  153.                         if each_uri == uri:
  154.                             continue
  155.                         (s, device_uri_rest) = each_uri.split (":", 1)
  156.                         if rest == device_uri_rest:
  157.                             # This one matches.  Check there is not
  158.                             # already a queue using this URI.
  159.                             if uri in used_uris:
  160.                                 break
  161.  
  162.                             try:
  163.                                 devices = c.getDevices(include_schemes=[scheme])
  164.                             except TypeError:
  165.                                 # include_schemes requires pycups 1.9.46
  166.                                 devices = c.getDevices ()
  167.  
  168.                             device_dict = devices.get (uri)
  169.                             if device_dict == None:
  170.                                 break
  171.  
  172.                             add_queue (device_dict.get ("device-id", ""),
  173.                                        [uri], fax_basename=uniquename)
  174.     else:
  175.         # Not an exact match.
  176.         uniquename = device_uris[0]
  177.  
  178.     if notification:
  179.         try:
  180.             notification.NewPrinter (status, uniquename, id_dict["MFG"],
  181.                                      id_dict["MDL"], id_dict["DES"],
  182.                                      reduce(lambda x, y: x + ',' + y,
  183.                                             id_dict["CMD"]))
  184.         except dbus.DBusException, e:
  185.             syslog (LOG_DEBUG, "D-Bus method call failed: %s" % e)
  186.  
  187. if len (sys.argv) < 3:
  188.    print "Syntax: %s {Device ID} {Device URI} [other device URIs...]"
  189.    sys.exit (1)
  190.  
  191. openlog ("udev-add-printer", 0, LOG_LPR)
  192. try:
  193.     add_queue (sys.argv[1], sys.argv[2:])
  194. except SystemExit, e:
  195.     sys.exit (e)
  196. except:
  197.     (type, value, tb) = sys.exc_info ()
  198.     tblast = traceback.extract_tb (tb, limit=None)
  199.     if len (tblast):
  200.         tblast = tblast[:len (tblast) - 1]
  201.     for line in traceback.format_tb (tb):
  202.         syslog (LOG_ERR, line.strip ())
  203.     extxt = traceback.format_exception_only (type, value)
  204.     syslog (LOG_ERR, extxt[0].strip ())
  205.